package cn.kgc.spring.day05.service.impl;

import cn.kgc.spring.day05.mapper.AccountMapper;
import cn.kgc.spring.day05.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author 课工场
 * @date 2024/11/8
 * @description
 *    @Transactional  事务注解
 *    1. 使用位置
 *        1.1 方法上     只对当前方法有效
 *        1.2 类上       类中所有的方法均有事务控制
 *    2. 注解属性
 *        isolation   事务隔离级别
 *     事务隔离级别
 *           1. READ_UNCOMMITTED     读未提交
 *
 *              A:   insert       commit     2  <->  3
 *              B:   select     3    脏读   不可重复读   幻读
 *           2.READ_COMMITTED        读已提交
 *
 *             A:   insert       commit     2  ->  3
 *             B:   select     2       不可重复读   幻读
 *
 *           3.REPEATABLE_READ       可重复读    mysql数据库默认事务隔离级别
 *
 *            A:   insert       commit     2  ->  3
 *            B:   select     2        幻读
 *
 *           4.SERIALIZABLE          串行化
 *
 *           A:   insert       commit     2  ->  3
 *           B:   select     2
 *
 *     事务特点:
 *         1. 原子性
 *         2. 一致性
 *         3.隔离性
 *         4.持久性
 *
 *    事务传播机制     propagation   7种
 *    1. REQUIRED   加入当前事务，如果不存在，请创建一个新事务  默认
 *    2. SUPPORTS   加入当前事务，如果不存在，则以非事务方式执行
 *    3. MANDATORY  加入当前事务,没有事务抛出异常   强制使用事务
 *
 *
 *    rollbackFor   设置发生什么异常时 回滚事务
 *
 */
@Service
@Transactional(propagation = Propagation.MANDATORY)
public class AccountServiceImpl implements AccountService {


    @Autowired
    private AccountMapper accountMapper;

    // @Transactional   //  开始事务管理
    @Override
    public Boolean transfer(String form, String to, Double money) {

        // 转出
        accountMapper.transfer(form,-money);
        // 转入
        accountMapper.transfer(to,money);

        int a = 1/0;
        return true;
    }




}
